package com.technology.javase;

//java中有23种设计模式
public class DesignMode {
    /**单例模式
     * 常见的spring默认创建的bean就是单例模式的
     * 单例模式可节约系统内存空间，控制资源的使用
     * 单例模式最重要的是确保对象只有一个（保证一个类在内存中的对象就一个）
     * RunTime就是典型的单例模式
     * */
    //单例模式

    /**
     * 饿汉式 懒汉式
     */
    public static void main(String[] args) {
        Single S =  Single.get();
        Single1 S1 = Single1.get();

        //GET()多少次，内存中使用的都是同一个对象
        System.out.println(S); //com.technology.javase.Single@27bc2616
        System.out.println(S1);//com.technology.javase.Single1@3941a79c

    }
}

/*
 * 目的:控制外界创建对象的个数只能创建1个对象
 * 开发步骤：
 * 1，私有化构造方法
 * 2，在类的内部创建好对象
 * 3，对外界提供一个公共的get(),返回一个已经准备好的对象
 * */
//饿汉式
class Single {
    //1，私有化构造方法,不让外界直接new
    private Single() {
    }

    //2,在类的内部创建好对象
    //static:静态只能调用静态
    static private Single s = new Single();

    //3,对外界提供一个公共的get(),返回一个已经准备好的对象
    //static是为了外界不通过对象访问而是通过类名直接调用方法
    static public Single get() {
        //注意：静态只能调用静态
        return s;
    }
}

//懒汉式
class Single1 {
    //  1、私有化构造方法，不让外界直接new
    private Single1() {
    }
//  2、在类的内部，创建好对象
    //static ：静态只能调用静态

    static private Single1 s = null;

    //3对外界提供一个公共的get(),返回一个已经准备好的对象
    //static是为了外界不通过对象访问而是通过类名直接调用方法
    synchronized static public Single1 get() {
        //注意：静态只能调用静态
        if (s == null) {
            s = new Single1(); //会有安全问题
        }
        return s;
    }
}

// TODO 扩展